Appearance
[English version](/posts/c教程/en-US/05-Input Output and Files/047-Command-Line Arguments (argc, argv))
每个C程序都可以直接从命令行接收输入,不scanf, 不fgets,只是运行可执行文件时传递的参数。这就是专业的 C 工具(例如gcc,ls, 和grep) 接收文件名、选项和标志。
函数签名
你的main函数可以带两个参数:
int main(int argc, char *argv[])| 参数 | 意义 |
|---|---|
argc | 参数计数(命令行参数的数量) |
argv | 参数向量(C 字符串数组,每个参数) |
argv[0]是程序名称本身,并且argv[1]接下来是用户提供的参数。
例子:
./hello world test然后:
-argc == 3 -argv[0] = "./hello" -argv[1] = "world" -argv[2] = "test"
小代码:打印命令行参数
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Argument count: %d\n", argc);
for (int i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}运行它:
./args foo bar 123输出:
Argument count: 4
argv[0] = ./args
argv[1] = foo
argv[2] = bar
argv[3] = 123检查是否缺少参数
如果您的程序需要参数,请检查argc在访问它们之前。
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
printf("Opening file: %s\n", argv[1]);
return 0;
}运行它:
./fileop输出:
Usage: ./fileop <filename>再次运行:
./fileop data.txt输出:
Opening file: data.txt将字符串参数转换为数字
所有命令行参数都是字符串。要将它们用作数字,请使用以下命令进行转换:
-atoi()– 字符串转整数 -atof()– 浮动字符串 -strtol()/strtod()– 更安全、更灵活的替代方案
例子:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]);
return 1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d + %d = %d\n", a, b, a + b);
return 0;
}跑步:
./sum 10 25输出:
10 + 25 = 35处理选项(标志)
您可以构建简单的命令行工具来手动处理选项:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int verbose = 0;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-v") == 0)
verbose = 1;
}
if (verbose)
printf("Verbose mode on\n");
else
printf("Run quietly\n");
return 0;
}跑步:
./tool -v输出:
Verbose mode onTiny Code:迷你文件回显工具
该程序打印作为参数传递的文件的内容:
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (!fp) {
perror("Error");
return 1;
}
char buf[128];
while (fgets(buf, sizeof(buf), fp))
printf("%s", buf);
fclose(fp);
return 0;
}跑步:
./echo mytext.txt为什么它很重要
argc和argv使您的 C 程序可编写脚本且可组合:
- 从命令行自动执行任务
- 与 shell 脚本或管道集成
- 处理多个输入文件
- 实施命令行标志和选项
每个现实世界的 C 实用程序,来自ls到gcc,取决于此模式。
自己尝试一下
编写一个程序,获取整数列表并打印它们的总和。
添加一个-r标志来反转打印参数的顺序。
构建一个“问候”工具:
./greet Alice Bob Charlie→Hello, Alice! Hello, Bob! Hello, Charlie!
编写一个“比较”工具来检查两个文件名是否相同。
结合argc和文件 I/O:将一个文件复制到另一个文件
./copy source.txt dest.txt通过命令行参数,您的 C 程序可以从静态练习发展为灵活的实际工具。接下来,您将探索读取配置文件,这是一种让您的程序自动适应而无需重新编译的强大方法。
